//package cn.edu.kzjsxy.graduationproject.config.interceptor;
//
//import cn.edu.kzjsxy.dormitoryManagement.system.common.ResultCode;
//import cn.edu.kzjsxy.dormitoryManagement.system.common.TokenUtil;
//import cn.edu.kzjsxy.dormitoryManagement.system.entity.RedisCache;
//import cn.edu.kzjsxy.dormitoryManagement.system.service.IRedisCacheService;
//import cn.edu.kzjsxy.dormitoryManagement.system.service.IUserService;
//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.servlet.HandlerInterceptor;
//import org.springframework.web.servlet.ModelAndView;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.time.LocalDateTime;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Author：chén jiā jùn
// * @Create：2024年04月03日18:40
// * 拦截器
// */
//public class CustomInterceptor implements HandlerInterceptor {
//
//	//	解析token
//	@Autowired
//	TokenUtil tokenUtil;
//	//	用户的信息的service
//	@Autowired
//	private IUserService userService;
//	// redis的service
//	@Autowired
//	private RedisTemplate<String, String> redisTemplate;
//	//  数据表缓存 redis的信息
//	@Autowired
//	IRedisCacheService redisCacheService;
//
//	//  token有效期
//	@Value("${spring.redis.cache.redis.time-to-live}")
//	private Long timeToLive;
//	//  是否启用redis
//	@Value("${spring.redis.enable}")
//	private boolean enable;
//
//
//	// 定义需要校验参数的接口路径列表
//	private List<String> protectedApiList = new ArrayList<>();
//
//
//
//	// 构造函数中初始化不需要校验参数的接口路径列表
//	public CustomInterceptor(TokenUtil tokenUtil,
//	                         IUserService userService,
//	                         RedisTemplate<String, String> redisTemplate,
//	                         IRedisCacheService redisCacheService) {
//		this.tokenUtil=tokenUtil;
//		this.userService=userService;
//		this.redisTemplate=redisTemplate;
//		this.redisCacheService=redisCacheService;
//		// 添加不需要校验参数的接口路径到列表中
//		protectedApiList.add("/auth/login");
//	}
//
//	@Override
//	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
//		// 获取请求的URI
//		String requestUri = request.getRequestURI();
//		// 检查是否需要校验参数
//		if (!protectedApiList.contains(requestUri)) {
//			String token = request.getHeader(ResultCode.TOKEN);
//			if (token == null) {
//				response.setStatus(HttpServletResponse.SC_FORBIDDEN);
//				return false;
//			}
////			判断token是否过期啦
//			boolean outcome = tokenUtil.valid(request);
////			判断是否要更新token过期日期
//			if(outcome){
//				postpone(token);
//			}else{
//				response.setCharacterEncoding("UTF-8");
//				response.setContentType("text/plain; charset=UTF-8");
//				response.setStatus(HttpServletResponse.SC_FORBIDDEN);
//				response.getWriter().write("token 无效!==>你没有登录或登录已过期!");  // 自定义错误信息
//			}
//			return outcome;
//		}
//		// 参数正确或者不需要校验，放行
//		return true;
//	}
//
//	@Override
//	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
//	                       ModelAndView modelAndView) throws Exception {
//		// 在处理器执行完成之后，视图渲染之前执行
//	}
//
//	@Override
//	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
//			throws Exception {
//		// 在整个请求完成之后执行，通常用于资源清理操作
//	}
//
//
//// 异步更新 token 过期时间
//	public void  postpone(String token){
//		if (enable) {
//			ExecutorService executorService = Executors.newSingleThreadExecutor();
//			executorService.submit(() -> {
//				redisTemplate.expire(token, timeToLive, TimeUnit.SECONDS);
//			});
//			executorService.shutdown();
//		} else {
//			ExecutorService executorService = Executors.newSingleThreadExecutor();
//			executorService.submit(() -> {
//				redisCacheService.update(new LambdaUpdateWrapper<RedisCache>()
//						.eq(RedisCache::getId, token)
//						.set(RedisCache::getEndTime, LocalDateTime.now().plusSeconds(timeToLive)));
//			});
//		}
//	}
//}
